package tmt.usercenter.web.repository;


import com.tmt.jpa.jpaservice.ITmtBaseRepo;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import tmt.usercenter.web.domain.TmtUser;
import tmt.usercenter.web.domain.enums.TmtUserType;

import java.util.List;

public interface ITmtUserRepo extends ITmtBaseRepo<TmtUser, Long> {

    TmtUser findByUsername(String name);

    TmtUser findFirstByUserType(TmtUserType userType);

    TmtUser findFirstByMobile(String mobile);

    List<TmtUser> findAllByMobile(String mobile);

    List<TmtUser> findAllByIntroducerCodeAndOriginSystemClientIdIn(Long introducerCode, List<String> clientId);

    @Query("select t.id from TmtUser t where t.username = :name")
    Long findIdByUsername(@Param("name") String name);

    /**
     * 用登录标识获取当前用户，标识可能为用户名，邮箱等信息。如果是邮箱，查找出来的用户可能不唯一
     *
     * @param id 登录标识
     * @return 匹配识别的用户，
     */
    @Query("select t from TmtUser t where t.username = :id or t.email = :id")
    List<TmtUser> findByUsernameOrEmail(@Param("id") String id);

    TmtUser findById(Long id);

    @Query("select t from TmtUser t where t.online = :online")
    List<TmtUser> findByOnline(@Param("online") boolean online);

    /**
     * 是否存在当前用户名
     *
     * @param username 用户名
     * @return 该用户名是否存在
     */
    boolean existsByUsername(String username);

    /**
     * 是否存在指定的手机号码
     *
     * @param mobile 手机号码
     * @return 该手机号码是否存在
     */
    boolean existsByMobile(String mobile);


    boolean existsByMobileAndIdNot(String mobile, Long userId);

    /**
     * 判断是否存在指定用户名和密码的用户
     *
     * @param username 用户名
     * @param password 用户密码
     * @return 该用户名是否存在
     */
    @Query("select t from TmtUser t where t.username = :username and t.password = :password")
    TmtUser findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);

    /**
     * 查找用户所在的应用系统的ID
     *
     * @param name
     * @return
     */
    @Query("select t.originSystem.id from TmtUser t where t.username = :name")
    Long findOriginSystemIdByUsername(@Param("name") String name);

    /**
     * 邮箱地址是否已存在
     *
     * @param email 邮箱地址
     * @return 是否已存在
     */
    boolean existsByEmail(String email);

    long countByMobileAndOriginSystemIdIn(String mobile, List<Long> systemIds);
}
